/**
 * axios 函数
 * 参数:  config 配置对象
 *        {method, url, params, headers, data}
 * 返回值: promise 对象
 *        成功的结果值 {config, status, statusText, headers, data}
 *        失败的结果值 {message, code, response}
 */
function axios(config) {
  //结构赋值
  let { method, url, params, headers, data, timeout } = config;
  return new Promise((resolve, reject) => {
    //发送 AJAX 请求
    let xhr = new XMLHttpRequest();
    //声明空字符串, 接收查询字符串的内容
    let query = '';
    //处理 params
    if (params) {
      //设置初始值的 ?
      query = '?'
      // {q: '战士', a: 100}   => q=战士&a=100&
      //遍历 params 对象
      for(let i in params){
        query += `${i}=${params[i]}&`;
      }
      //截取字符串  删除最后的 &
      query = query.slice(0, -1);
      // query = query.slice(0, query.length - 1);
    }
    //初始化
    xhr.open(method, url + query);
    //请求头
    if(headers){
      //遍历 headers
      for(let i in headers){
        xhr.setRequestHeader(i, headers[i]);
      }
    }
    //请求体
    //判断
    if(typeof data === 'object'){
      //如果是对象形式, 将对象转为 JSON 字符串
      let json = JSON.stringify(data);
      //设置对应的 content-type 请求头
      xhr.setRequestHeader('content-type','application/json');
      //设置请求体
      xhr.send(json);
    }else if(typeof data === 'string'){
      // data    a=100&b=200
      xhr.setRequestHeader('content-type','application/x-www-form-urlencoded');
      xhr.send(data);
    }else{
      //如果是其他值的情况, 直接发送, 不设置请求体
      xhr.send();
    }

    //处理响应结果
    xhr.onreadystatechange = function(){
      if(xhr.readyState === 4){
        let res = {
          status: xhr.status,
          statusText: xhr.statusText,
          headers: xhr.getAllResponseHeaders(),
          data: xhr.response,
          config: config,
          request: xhr
        }
        if(xhr.status >= 200 && xhr.status < 300){
          //请求成功的情况
          resolve(res);
        }else if(xhr.status >= 400 && xhr.status < 600){
          //请求成功的情况
          reject({
            config: config,
            isAxiosError: true,
            request: xhr,
            response: res,
            message: '请求失败~~~'
          });
        }
      }
    }

    //处理请求超时
    xhr.timeout = timeout;
    xhr.ontimeout = function(){
      reject({
        message: '请求超时'
      });
    }
    
  });
}

axios({
  timeout: 1000,
  method: "post",
  url: "http://localhost:8090/test",
  params: {
    q: "战士",
    a: 100,
  },
  headers: {
    b: 200,
    c: 300,
    token: 'ganshane'
  },
  data: 'a=100&b=200'

}).then(response => {
  console.log(response);
}, err => {
  console.dir(err);
})
